/*
 * Boleta.java
 *
 * Created on __DATE__, __TIME__
 */

package cl.pelu.operacion;

import java.awt.Frame;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.beans.PropertyVetoException;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;


import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

import org.apache.log4j.Logger;

import cl.pelu.main.PeluqueriaApp;
import cl.pelu.model.bo.dvo.BoletaBO;
import cl.pelu.model.bo.dvo.ClienteDVO;
import cl.pelu.model.bo.dvo.DetalleBO;
import cl.pelu.model.bo.dvo.FormulaBO;
import cl.pelu.model.bo.dvo.ServicioDVO;
import cl.pelu.model.bo.dvo.ServicioDetalleBO;
import cl.pelu.model.bo.dvo.TablaDVO;
import cl.pelu.model.bo.dvo.TipoCabelloDVO;
import cl.pelu.test.Test;
import cl.pelu.utils.PeluFacade;

/**
 * 
 * @author __USER__
 */
public class Boleta extends javax.swing.JInternalFrame {
	
	private static final Logger logger = Logger.getLogger(Boleta.class);
	
	

	
	private Date date;
	private DateFormat df;
	private javax.swing.JButton agregaFormulaButton;
	private javax.swing.JButton agregarServicioButton;
	private javax.swing.JButton asociarClienteButton;
	private javax.swing.JLayeredPane cabeceraLayeredPane;
	private javax.swing.JLabel cantidadLabel;
	private javax.swing.JTextField cantidadTextField;
	private javax.swing.JLayeredPane detalleLayeredPane;
	private javax.swing.JTable detalleTable;
	private javax.swing.JButton eliminarBoletaButton;
	private javax.swing.JButton eliminarServicioButton;
	private javax.swing.JTextField fechaBoletaTextField;
	private javax.swing.JLabel fechaLabel;
	private javax.swing.JButton guardarBoletaButton;
	private javax.swing.JLabel descripcionLabel;
	private javax.swing.JScrollPane jScrollPane1;
	private javax.swing.JScrollPane jScrollPane2;
	private javax.swing.JButton verFormulasButton;
	private javax.swing.JLabel montoDescuentoLabel;
	private javax.swing.JTextField montoDescuentoTextField;
	private javax.swing.JLabel nombreClienteLabel;
	private javax.swing.JTextField nombreClienteTextField;
	private javax.swing.JComboBox nombreServicioComboBox;
	private javax.swing.JLabel nombreServicioLabel;
	private javax.swing.JLabel numBoletaLabel;
	private javax.swing.JTextField numBoletaTextField;
	private javax.swing.JTextArea observacionesTextArea;
	private javax.swing.JLabel porcentajeDescuentoLabel;
	private javax.swing.JTextField porcentajeDescuentoTextField;
	private javax.swing.JLabel precioUnitarioLabel;
	private javax.swing.JTextField precioUnitarioTextField;
	private javax.swing.JLabel rutLabel;
	private javax.swing.JTextField rutTextField;
	private javax.swing.JButton salirButton;
	private javax.swing.JLabel subTotalLabel;
	private javax.swing.JTextField subTotalTextField;
	private javax.swing.JComboBox tipoCabelloComboBox;
	private javax.swing.JLabel tipoCabelloLabel;
	private javax.swing.JLabel totalLabel;
	private javax.swing.JTextField totalTextField;
	private javax.swing.JLayeredPane totalesLayeredPane;
	private javax.swing.JLabel valorVentaLabel;
	private javax.swing.JTextField valorVentaTextField;
	private javax.swing.JButton actualizarBoletaButton;
	private javax.swing.JButton borrarClienteButton;

	private static Boleta myInstance;
	private BoletaBO boletaBO;
	private ServicioColor servicioColor;
	

	// End of variables declaration//GEN-END:variables

	public static Boleta getInstance() throws PropertyVetoException, SQLException {
		if (myInstance == null) {
			myInstance = new Boleta();
		}
		return myInstance;
	}

	

	public Boleta() throws PropertyVetoException, SQLException {
		initComponents();
	}
	


	public void initComponents() throws SQLException {
		
		logger.debug("inicializacion boleta");

		numBoletaLabel = new javax.swing.JLabel("Numero Boleta");
		descripcionLabel = new javax.swing.JLabel("Descripcion");
		rutLabel = new javax.swing.JLabel("Rut");
		nombreClienteLabel = new javax.swing.JLabel("Nombre Cliente");
		fechaLabel = new javax.swing.JLabel("Fecha");
		cantidadLabel = new javax.swing.JLabel("Cantidad");
		nombreServicioLabel = new javax.swing.JLabel("Nombre Servicio");
		precioUnitarioLabel = new javax.swing.JLabel("Precio Unitario");
		subTotalLabel = new javax.swing.JLabel("Sub Total");
		totalLabel = new javax.swing.JLabel("Total");
		tipoCabelloLabel = new javax.swing.JLabel("Tipo Cabello");
		porcentajeDescuentoLabel = new javax.swing.JLabel("% Descuento");
		valorVentaLabel = new javax.swing.JLabel("Valor Venta");
		montoDescuentoLabel = new javax.swing.JLabel("Monto Descuento");
		
		cabeceraLayeredPane = new javax.swing.JLayeredPane();
		detalleLayeredPane = new javax.swing.JLayeredPane();
		totalesLayeredPane = new javax.swing.JLayeredPane();
		
		jScrollPane1 = new javax.swing.JScrollPane();
		
		fechaBoletaTextField = new javax.swing.JTextField();
		numBoletaTextField = new javax.swing.JTextField();
		rutTextField = new javax.swing.JTextField();
		nombreClienteTextField = new javax.swing.JTextField();
		cantidadTextField = new javax.swing.JTextField();
		precioUnitarioTextField = new javax.swing.JTextField();
		valorVentaTextField = new javax.swing.JTextField();
		totalTextField = new javax.swing.JTextField();
		porcentajeDescuentoTextField = new javax.swing.JTextField();
		montoDescuentoTextField = new javax.swing.JTextField();
		subTotalTextField = new javax.swing.JTextField();
		
		asociarClienteButton = new javax.swing.JButton("Asociar Cliente");
		eliminarServicioButton = new javax.swing.JButton("Eliminar Servicio");
		agregarServicioButton = new javax.swing.JButton("Agregar Servicio");
		agregaFormulaButton = new javax.swing.JButton("Formula");
		eliminarBoletaButton = new javax.swing.JButton("Eliminar Boleta");
		guardarBoletaButton = new javax.swing.JButton("Guardar Boleta");
		verFormulasButton = new javax.swing.JButton("Ver Formula");
		salirButton = new javax.swing.JButton("Salir");
		actualizarBoletaButton = new javax.swing.JButton("Actualizar");
		
		detalleTable = new javax.swing.JTable();
		
		nombreServicioComboBox = new javax.swing.JComboBox();
		tipoCabelloComboBox = new javax.swing.JComboBox();
		
		jScrollPane2 = new javax.swing.JScrollPane();
		observacionesTextArea = new javax.swing.JTextArea();
		nombreServicioComboBox = new javax.swing.JComboBox(PeluFacade.getPeluqueriaComponent().getServicioAgrupado());
		
		boletaBO = new BoletaBO();
		borrarClienteButton = new javax.swing.JButton("Borrar Cliente");
		
		df = new SimpleDateFormat ("dd/MM/yyyy");
		date = new Date();
		
		fechaBoletaTextField.setText(df.format(date));  

		setClosable(true);



		rutLabel.setBounds(20, 50, 120, 20);
		nombreClienteLabel.setBounds(20, 80, 110, 20);
		fechaLabel.setBounds(960, 20, 90, 20);
		numBoletaLabel.setBounds(20, 20, 140, 24);
		cantidadLabel.setBounds(50, 30, 100, 10);
		nombreServicioLabel.setBounds(150, 30, 200, 10);
		tipoCabelloLabel.setBounds(550, 30, 120, 20);
		precioUnitarioLabel.setBounds(700, 30, 150, 20);
		valorVentaLabel.setBounds(850, 30, 150, 20);
		fechaBoletaTextField.setBounds(1070, 20, 104, 20);
		numBoletaTextField.setBounds(200, 20, 210, 20);
		totalLabel.setBounds(530, 70, 160, 30);
		subTotalLabel.setBounds(530, 10, 100, 20);
		rutTextField.setBounds(200, 50, 210, 20);
		nombreClienteTextField.setBounds(200, 80, 210, 20);
		cantidadTextField.setBounds(50, 60, 50, 20);
		nombreServicioComboBox.setBounds(150, 60, 200, 20);
		tipoCabelloComboBox.setBounds(550, 60, 120, 20);
		precioUnitarioTextField.setBounds(700, 60, 100, 20);
		valorVentaTextField.setBounds(850, 60, 100, 20);
		subTotalTextField.setBounds(740, 10, 170, 20);
		asociarClienteButton.setBounds(530, 20, 140, 30);
		porcentajeDescuentoTextField.setBounds(740, 30, 170, 20);
		montoDescuentoLabel.setBounds(530, 50, 170, 20);
		montoDescuentoTextField.setBounds(740, 50, 170, 20);
		jScrollPane1.setBounds(20, 120, 920, 90);
		eliminarServicioButton.setBounds(960, 170, 170, 20);
		
		cabeceraLayeredPane.setBorder(javax.swing.BorderFactory.createTitledBorder(	javax.swing.BorderFactory.createEtchedBorder(),	"Cabecera"));

		
		
		cabeceraLayeredPane.add(fechaBoletaTextField,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		cabeceraLayeredPane.add(numBoletaTextField,javax.swing.JLayeredPane.DEFAULT_LAYER);
		totalesLayeredPane.add(subTotalLabel,javax.swing.JLayeredPane.DEFAULT_LAYER);
		totalesLayeredPane.add(totalLabel,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		totalesLayeredPane.add(actualizarBoletaButton,javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(cantidadTextField,		javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(nombreServicioComboBox,		javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(tipoCabelloComboBox,		javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(precioUnitarioTextField,		javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(valorVentaTextField,		javax.swing.JLayeredPane.DEFAULT_LAYER);
		totalesLayeredPane.add(subTotalTextField,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		cabeceraLayeredPane.add(rutTextField,javax.swing.JLayeredPane.DEFAULT_LAYER);
		cabeceraLayeredPane.add(nombreClienteTextField,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		cabeceraLayeredPane.add(rutLabel,javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(cantidadLabel,javax.swing.JLayeredPane.DEFAULT_LAYER);
		cabeceraLayeredPane.add(numBoletaLabel,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		cabeceraLayeredPane.add(fechaLabel,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		cabeceraLayeredPane.add(nombreClienteLabel,javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(nombreServicioLabel,javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(tipoCabelloLabel,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(precioUnitarioLabel,javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(valorVentaLabel,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		cabeceraLayeredPane.add(asociarClienteButton,javax.swing.JLayeredPane.DEFAULT_LAYER);
		totalesLayeredPane.add(porcentajeDescuentoTextField,javax.swing.JLayeredPane.DEFAULT_LAYER);
		totalesLayeredPane.add(montoDescuentoLabel,javax.swing.JLayeredPane.DEFAULT_LAYER);
		totalesLayeredPane.add(montoDescuentoTextField,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(jScrollPane1,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(eliminarServicioButton,javax.swing.JLayeredPane.DEFAULT_LAYER);
		
		
		agregaFormulaButton.setBounds(360, 60, 150, 20);
		agregarServicioButton.setBounds(960, 130, 170, 20);
		jScrollPane2.setBounds(20, 220, 670, 60);
		verFormulasButton.setBounds(960, 100, 170, 20);
		totalTextField.setBounds(740, 70, 171, 20);
		eliminarBoletaButton.setBounds(1010, 10, 150, 20);
		guardarBoletaButton.setBounds(1010, 40, 150, 20);
		porcentajeDescuentoLabel.setBounds(530, 30, 170, 20);
		
		detalleLayeredPane.add(agregarServicioButton,javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(agregaFormulaButton,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(jScrollPane2,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		detalleLayeredPane.add(verFormulasButton,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		totalesLayeredPane.add(totalTextField,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		totalesLayeredPane.add(eliminarBoletaButton,	javax.swing.JLayeredPane.DEFAULT_LAYER);
		totalesLayeredPane.add(guardarBoletaButton,		javax.swing.JLayeredPane.DEFAULT_LAYER);
		totalesLayeredPane.add(porcentajeDescuentoLabel,javax.swing.JLayeredPane.DEFAULT_LAYER);
		
		totalTextField.setEditable(false);
		rutTextField.setEditable(false);
		nombreClienteTextField.setEditable(false);
		precioUnitarioTextField.setEditable(false);
		valorVentaTextField.setEditable(false);

		
		
		
		
		agregaFormulaButton.setEnabled(false);
		agregaFormulaButton.addActionListener(new java.awt.event.ActionListener() {
					public void actionPerformed(java.awt.event.ActionEvent evt) {
						try {
							agregaFormulaButtonActionPerformed(evt);
						} catch (PropertyVetoException e) {
							logger.error(e);
							JOptionPane.showMessageDialog(null, "error al agregar boleta ");
						} catch (SQLException e) {
							logger.error(e);
							JOptionPane.showMessageDialog(null, "error al agregar boleta ");
							
						}
					}
				});
		
		

		observacionesTextArea.setColumns(20);
		observacionesTextArea.setRows(5);
		jScrollPane2.setViewportView(observacionesTextArea);

		verFormulasButton.addActionListener(new java.awt.event.ActionListener() {
					public void actionPerformed(java.awt.event.ActionEvent evt) {
						verFormulasButtonActionPerformed(evt);
					}
				});
		
		
		
		verFormulasButton.setEnabled(false);
		

		totalesLayeredPane.setBorder(javax.swing.BorderFactory
				.createTitledBorder(
						javax.swing.BorderFactory.createEtchedBorder(),
						"Totales"));

		
		
		numBoletaTextField.setText(	""+(PeluFacade.getPeluqueriaComponent().getIdUltimaBoleta()+1));
		
			
		
		
		asociarClienteButton.addActionListener(new java.awt.event.ActionListener() {
					public void actionPerformed(java.awt.event.ActionEvent evt) {
						try {
							asociarClienteButtonActionPerformed(evt);
						} catch (PropertyVetoException e) {
							logger.error(e);
							JOptionPane.showMessageDialog(null, "error al asociar cliente ");
							
						} catch (SQLException e) {
							logger.error(e);
							JOptionPane.showMessageDialog(null, "error al asociar cliente ");
						}
					}
				});
		
		
		



		montoDescuentoTextField.setEditable(false);
		
		

		detalleLayeredPane.setBorder(javax.swing.BorderFactory
				.createTitledBorder(
						javax.swing.BorderFactory.createEtchedBorder(),
						"Detalle"));

		jScrollPane1.setViewportView(detalleTable);

				
		numBoletaTextField.setEnabled(false);
		
		
		cantidadTextField.addKeyListener(new KeyListener() {
			
			@Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
			}
			
			@Override
			public void keyReleased(KeyEvent e) {
				calcularValorVenta();
			}
			
			@Override
			public void keyPressed(KeyEvent e) {
				
				
			}
		});
		
		detalleTable.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				try {
					jTable1MouseClicked(evt);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		
		
		


		tipoCabelloComboBox.addItemListener(new ItemListener() {
			@Override
			public void itemStateChanged(ItemEvent event) {
				if (event.getStateChange() == ItemEvent.SELECTED) {

					try {

						precioUnitarioTextField.setText( ""
								+PeluFacade.getPeluqueriaComponent().getPrecioByNombreTipoCabello(
										((TablaDVO)nombreServicioComboBox.getSelectedItem()).getNombre(),
										((TipoCabelloDVO)tipoCabelloComboBox.getSelectedItem()).getNombre()));		
				
						if (precioUnitarioTextField.getText().equals("null")) {
							JOptionPane.showMessageDialog(null,
									"precio no existe en el sistema");
						}
						if(PeluFacade.getPeluqueriaComponent().isFormulaByNombreTipoCabello(
								((TablaDVO)nombreServicioComboBox.getSelectedItem()).getNombre(),
								((TipoCabelloDVO)tipoCabelloComboBox.getSelectedItem()).getNombre()		
						)>0){
							
							agregaFormulaButton.setEnabled(true);
							
						}else{
							agregaFormulaButton.setEnabled(false);
						}

						calcularValorVenta();
					} catch (Exception e) {

						e.printStackTrace();
					}
				}
			}
		});
		



		
		porcentajeDescuentoTextField.addKeyListener(new KeyListener() {
			
			@Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
			}
			
			@Override
			public void keyReleased(KeyEvent e) {
				calcularPorcentajeDescuento();
			}
			
			@Override
			public void keyPressed(KeyEvent e) {
				
				
			}
		});


		agregarServicioButton.setText("Agregar Servicio");
		agregarServicioButton.setActionCommand("agregarservicio");
		agregarServicioButton
				.addActionListener(new java.awt.event.ActionListener() {
					public void actionPerformed(java.awt.event.ActionEvent evt) {
						try {
							agregarServicioButtonActionPerformed(evt);
						} catch (HeadlessException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						} catch (SQLException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				});


		porcentajeDescuentoTextField
				.addActionListener(new java.awt.event.ActionListener() {
					public void actionPerformed(java.awt.event.ActionEvent evt) {
						porcentajeDescuentoTextFieldActionPerformed(evt);
					}

					private void porcentajeDescuentoTextFieldActionPerformed(
							ActionEvent evt) {

					}
				});
		


		salirButton.setText("Salir");
		salirButton.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				
				dispose();
				
			}
			

		});
		
		actualizarBoletaButton.setBounds(1010, 70, 150, 20);
		salirButton.setBounds(1010, 100, 150, 20);
		
		totalesLayeredPane.add(salirButton,	javax.swing.JLayeredPane.DEFAULT_LAYER);

		subTotalTextField
				.addActionListener(new java.awt.event.ActionListener() {
					public void actionPerformed(java.awt.event.ActionEvent evt) {
						subTotalTextFieldActionPerformed(evt);
					}
				});

		eliminarServicioButton
				.addActionListener(new java.awt.event.ActionListener() {
					public void actionPerformed(java.awt.event.ActionEvent evt) {
						eliminarServicioActionPerformed(evt);
					}
				});
		
		guardarBoletaButton.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				try {
					guardarBoletaActionPerformed(evt);
				} catch (ParseException e) {
					JOptionPane.showMessageDialog(null, "Error al guardar la boleta, revise todos los datos del formulario");
				} catch (SQLException e) {
					JOptionPane.showMessageDialog(null, "Error al guardar la boleta, revise todos los datos del formulario");
				} catch (NumberFormatException e) {
				JOptionPane.showMessageDialog(null, "Error al guardar la boleta, revise todos los datos del formulario");
				
				}
			}
		});
		
		eliminarBoletaButton.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				try {
					eliminarBoletaServicioButtonActionPerformed(evt);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		
		borrarClienteButton.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
					borrarClienteButtonActionPerformed(evt);
			}
		});
		
		
		actualizarBoletaButton.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				try {
					actualizarBoletaActionPerformed(evt);
				} catch (ParseException e) {
					
					logger.error(e);
					JOptionPane.showMessageDialog(null, "Error:parseException al actualizar la boleta, revise todos los datos del formulario");
					
				} catch (SQLException e) {
					logger.error(e);
					JOptionPane.showMessageDialog(null, "Error:sqlException al actualizar la boleta, revise todos los datos del formulario");
				}
			}
		});
		

		detalleTable.setModel(new javax.swing.table.DefaultTableModel(
				new Object[][] {

				}, new String[] {  "cantidad", "nombre servicio",
						"detalle","Tipo Cabello ","precio unitario", "valor venta" }) {
			Class[] types = new Class[] { 
					java.lang.String.class, java.lang.String.class,
					java.lang.Object.class, java.lang.Object.class,
					java.lang.Object.class ,java.lang.Object.class};
			boolean[] canEdit = new boolean[] { false, false, false, false,
					false, false };

			public Class getColumnClass(int columnIndex) {
				return types[columnIndex];
			}

			public boolean isCellEditable(int rowIndex, int columnIndex) {
				return canEdit[columnIndex];
			}
		});
		

		nombreServicioComboBox.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {

			try {
				nombreServicioComboBoxActionPerformed(evt);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
					
					
			
				
			}
		});

		javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
				getContentPane());
		getContentPane().setLayout(layout);
		layout.setHorizontalGroup(layout
				.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(
						layout.createSequentialGroup()
								.addContainerGap()
								.addGroup(
										layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.LEADING)
												.addGroup(
														layout.createSequentialGroup()
																.addGroup(
																		layout.createParallelGroup(
																				javax.swing.GroupLayout.Alignment.LEADING)
																				.addComponent(
																						cabeceraLayeredPane,
																						javax.swing.GroupLayout.DEFAULT_SIZE,
																						1208,
																						Short.MAX_VALUE)
																				.addComponent(
																						totalesLayeredPane,
																						javax.swing.GroupLayout.DEFAULT_SIZE,
																						1208,
																						Short.MAX_VALUE))
																.addContainerGap())
												.addGroup(
														layout.createSequentialGroup()
																.addComponent(
																		detalleLayeredPane,
																		javax.swing.GroupLayout.DEFAULT_SIZE,
																		1178,
																		Short.MAX_VALUE)
																.addGap(42, 42,
																		42)))));
		layout.setVerticalGroup(layout
				.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(
						layout.createSequentialGroup()
								.addComponent(cabeceraLayeredPane,
										javax.swing.GroupLayout.PREFERRED_SIZE,
										116,
										javax.swing.GroupLayout.PREFERRED_SIZE)
								.addPreferredGap(
										javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
								.addComponent(detalleLayeredPane,
										javax.swing.GroupLayout.PREFERRED_SIZE,
										295,
										javax.swing.GroupLayout.PREFERRED_SIZE)
								.addPreferredGap(
										javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(totalesLayeredPane,
										javax.swing.GroupLayout.PREFERRED_SIZE,
										134,
										javax.swing.GroupLayout.PREFERRED_SIZE)
								.addContainerGap(
										javax.swing.GroupLayout.DEFAULT_SIZE,
										Short.MAX_VALUE)));
		tipoCabelloComboBox.setVisible(false);
		tipoCabelloLabel.setVisible(false);
		actualizarBoletaButton.setEnabled(false);
		
		
		pack();
	}


	private void agregarServicioButtonActionPerformed(
			java.awt.event.ActionEvent evt) throws HeadlessException, SQLException {

		Boolean datosCorrectos = true;
		TablaDVO nombreServicio = (TablaDVO)nombreServicioComboBox.getSelectedItem();
		TipoCabelloDVO tipoCabello = (TipoCabelloDVO)tipoCabelloComboBox.getSelectedItem();
		
		if (cantidadTextField.getText().isEmpty()) {
			JOptionPane.showMessageDialog(null, "Debe ingresar la cantidad");
			datosCorrectos = false;
		} else if (valorVentaTextField.getText().isEmpty()) {
			JOptionPane.showMessageDialog(null, "Debe ingresar un Valor Venta");
			datosCorrectos = false;
		} else if (precioUnitarioTextField.getText().isEmpty()) {
			JOptionPane.showMessageDialog(null,
					"Debe ingresar un Valor Unitario");
			datosCorrectos = false;
		} else 	if(PeluFacade.getPeluqueriaComponent().isFormulaByNombreTipoCabello(nombreServicio.getNombre(),tipoCabello.getNombre())>0
				&& this.servicioColor == null) {
			
			JOptionPane.showMessageDialog(null, "Debe seleccionar una formula");
			datosCorrectos = false;

		}

		if (datosCorrectos) {
			this.agregarDetalle();
		}

	}

	private void agregaFormulaButtonActionPerformed(
			java.awt.event.ActionEvent evt) throws PropertyVetoException, SQLException {
		
		Frame frame = JOptionPane.getFrameForComponent(this);
		ServicioDetalleBO servicioDetalleBO = new ServicioDetalleBO();
		servicioDetalleBO.setNombre((TablaDVO)nombreServicioComboBox.getSelectedItem());
		servicioColor = ServicioColor.getInstance(frame, servicioDetalleBO, true);
		servicioColor.limpiarFormulario();
		servicioColor.setVisible(true);
		servicioColor.getServicioDVO();
		this.servicioColor = servicioColor;

	}

	private void eliminarBoletaServicioButtonActionPerformed(java.awt.event.ActionEvent evt) throws SQLException {

		int confirmado = JOptionPane.showConfirmDialog(null,"seguro que quires eliminar la boleta");
		if (JOptionPane.OK_OPTION == confirmado) {

			int id = Integer.parseInt(numBoletaTextField.getText());
			PeluFacade.getPeluqueriaComponent().eliminarBoleta(id);
			
			this.limpiarFormulario();
		
		}

	}

	


	private void eliminarServicioActionPerformed(java.awt.event.ActionEvent evt) {

		DefaultTableModel tableModel = (DefaultTableModel) this.detalleTable
				.getModel();

		if (detalleTable.getSelectedRow() > -1) {

			detalleTable.getSelectedRow();
			int idServicio = Integer.parseInt(""
					+ tableModel.getValueAt(detalleTable.getSelectedRow(), 0));
			ArrayList<ServicioDetalleBO> servicio = this.boletaBO.getServiciosList();
			for (ServicioDetalleBO servicioDVO : servicio) {
				if (servicioDVO.getIdServicio() == idServicio) {
					boletaBO.getServiciosList().remove(servicioDVO);
				}

			}
			tableModel.removeRow(detalleTable.getSelectedRow());
		}

	}

	private void subTotalTextFieldActionPerformed(java.awt.event.ActionEvent evt) {
		DefaultTableModel tableModel = (DefaultTableModel) this.detalleTable
				.getModel();

		if (detalleTable.getSelectedRow() > -1) {
			tableModel.removeRow(detalleTable.getSelectedRow());
		}
	}

	private void calcularValorVenta() {


		if(this.cantidadTextField.getText().length() > 0
			&& this.precioUnitarioTextField.getText().length()>0){

			int cantidad = Integer.parseInt(this.cantidadTextField.getText());
			int precioUnitario = Integer.parseInt(this.precioUnitarioTextField.getText());
			this.valorVentaTextField.setText("" + (cantidad * precioUnitario));

			
		}
		

	}

	private void calcularSubTotal() {

		DefaultTableModel tableModel = (DefaultTableModel) this.detalleTable
				.getModel();

		int subtotal = 0;
		for (int i = 0; i < tableModel.getRowCount(); i++) {

			subtotal = subtotal
					+ Integer.parseInt("" + tableModel.getValueAt(i, 5));

		}
		this.subTotalTextField.setText("" + subtotal);
		porcentajeDescuentoTextField.setText(porcentajeDescuentoTextField.getText().length() > 0	?porcentajeDescuentoTextField.getText():"0");
		

	}

	private void agregarDetalle() {

	
		DefaultTableModel tableModel = (DefaultTableModel) this.detalleTable.getModel();
		ServicioDetalleBO servicioBO = new ServicioDetalleBO();
		
		boolean tieneFormula = false;
	
		if (this.servicioColor != null) {

			ArrayList formulaBO = this.servicioColor.getServicioDVO().getFormula();
		
			if (formulaBO != null && formulaBO.size() > 0) {
				tieneFormula = true;
				
			} else {
				System.err.println("No tiene ninguna formula agregada");
			}
		}

	
		if (this.servicioColor != null) {
			servicioBO = (ServicioDetalleBO) this.servicioColor.getServicioDVO()
					.clone();
		} else {
			servicioBO = new ServicioDetalleBO();
		}

		servicioBO.setNombre((TablaDVO)nombreServicioComboBox.getSelectedItem());
		servicioBO.setCantidad(Integer.parseInt(cantidadTextField.getText()));
		servicioBO.setPrecioUnitario(Integer.parseInt(precioUnitarioTextField.getText().toString()));
		servicioBO.setValorVenta(Integer.parseInt(valorVentaTextField.getText().toString()));
		servicioBO.setTipoCabello((TipoCabelloDVO)this.tipoCabelloComboBox.getSelectedItem());
		
		
		
		this.boletaBO.addServicio(servicioBO);
		
		tableModel.addRow(new Object[] { 
				cantidadTextField.getText(),
				(TablaDVO	)nombreServicioComboBox.getSelectedItem(),
				tieneFormula?"formula ingresada":"",
				tipoCabelloComboBox.getSelectedItem(),
				precioUnitarioTextField.getText().toString(),
				valorVentaTextField.getText().toString()

		});

		calcularSubTotal();
		calcularPorcentajeDescuento();

	}
	
	private void calcularPorcentajeDescuento() throws NumberFormatException{
		
		Double porcentaje=0d;
		
		if(this.porcentajeDescuentoTextField.getText().length()>0){

			 porcentaje = (Double.parseDouble(this.porcentajeDescuentoTextField.getText())/100);
			
		}
		Double subtotal = Double.parseDouble(subTotalTextField.getText());
		Double montoDescuento = (subtotal * porcentaje );
	    montoDescuentoTextField.setText(""+ montoDescuento.intValue() );
		totalTextField.setText(""+(subtotal.intValue()-montoDescuento.intValue()));
		
		
		
		
		
	}
	
	private void jTable1MouseClicked(java.awt.event.MouseEvent evt) throws SQLException {
		
		
		

		TablaDVO nombreServicio = (TablaDVO )this.detalleTable.getValueAt(this.detalleTable.getSelectedRow(), 1);
		TipoCabelloDVO tipoCabello = (TipoCabelloDVO)this.detalleTable.getValueAt(this.detalleTable.getSelectedRow(), 3);
	
			tipoCabelloComboBox.setVisible(false);
			tipoCabelloLabel.setVisible(false);
			
			System.out.println(nombreServicio.getNombre());
			System.out.println(tipoCabello.getNombre());
			if(PeluFacade.getPeluqueriaComponent().isFormulaByNombreTipoCabello(nombreServicio.getNombre(),tipoCabello.getNombre())>0){
				
				verFormulasButton.setEnabled(true);
				
				
			}else{
				verFormulasButton.setEnabled(false);
			}
			eliminarServicioButton.setEnabled(true);
		
		
	}
	
	private void asociarClienteButtonActionPerformed(
			java.awt.event.ActionEvent evt) throws PropertyVetoException, SQLException {
		
		Frame frame = JOptionPane.getFrameForComponent(this);
		BuscarCliente buscarCliente  = BuscarCliente.getInstance(frame,true);
		buscarCliente.limpiarFormulario();
		buscarCliente.setVisible(true);
		
		rutTextField.setText(buscarCliente.getRut());
		nombreClienteTextField.setText(buscarCliente.getNombre());
		
		

	}
	
	
	
	
		private void guardarBoletaActionPerformed(java.awt.event.ActionEvent evt) throws ParseException, SQLException, NumberFormatException{
			
			calcularPorcentajeDescuento();
			
			this.boletaBO.setObservaciones(observacionesTextArea.getText());
			this.boletaBO.setSubtotal(Integer.parseInt(subTotalTextField.getText()));
			this.boletaBO.setMontoDescuento(Integer.parseInt(montoDescuentoTextField.getText()));
			this.boletaBO.setTotal(Integer.parseInt(totalTextField.getText()));
			this.boletaBO.setNumeroBoleta(Integer.parseInt(numBoletaTextField.getText()));
			
			ClienteDVO cliente = new  ClienteDVO();
			cliente.setRut(rutTextField.getText());
			cliente.setNombre(nombreClienteTextField.getText());
			
			this.boletaBO.setCliente(cliente);
					
			if(JOptionPane.showConfirmDialog(null, "esta seguro de almacenar el registro")==JOptionPane.YES_OPTION)
			{
				this.boletaBO.setFecha(df.parse(fechaBoletaTextField.getText()));
				PeluFacade.getPeluqueriaComponent().guardarBoleta(this.boletaBO);
				JOptionPane.showMessageDialog(null,"La boleta fue guardada con exito", "Guardar Boleta",JOptionPane.INFORMATION_MESSAGE );
				eliminarBoletaButton.setEnabled(true);
				actualizarBoletaButton.setEnabled(true);
				guardarBoletaButton.setEnabled(false);
			}
	
	  }
		
		public void limpiarFormulario() throws SQLException{
			
				numBoletaTextField.setText(	""+(PeluFacade.getPeluqueriaComponent().getIdUltimaBoleta()+1));
				cantidadTextField.setText("");
				nombreServicioComboBox.setSelectedIndex(0);
				precioUnitarioTextField.setText("");
				valorVentaTextField.setText("");
				subTotalTextField.setText("");
				porcentajeDescuentoTextField.setText("");
				montoDescuentoTextField.setText("");
				totalTextField.setText("");
				observacionesTextArea.setText("");
				rutTextField.setText("");
				nombreClienteTextField.setText("");
				actualizarBoletaButton.setEnabled(false);
				eliminarBoletaButton.setEnabled(false);
				guardarBoletaButton.setEnabled(true);
				eliminarServicioButton.setEnabled(false);
				
				
				
			
				nombreServicioComboBoxActionPerformed(null);
				calcularValorVenta();
				limpiarTabla();
				 
			
		}
		
		void limpiarTabla (){
			
			DefaultTableModel tableModel = (DefaultTableModel) this.detalleTable.getModel();
			int a = tableModel.getRowCount();
			for (int i = 0; i < a; i++) {
				tableModel.removeRow(0);
				
			}
		}
		
		
		public void cargarBoleta(BoletaBO boleta){
			
			this.boletaBO = boleta;

			numBoletaTextField.setText(""+boleta.getNumeroBoleta());
			cantidadTextField.setText("");
			precioUnitarioTextField.setText("");
			valorVentaTextField.setText("");
			
			subTotalTextField.setText(""+boleta.getSubtotal());
			porcentajeDescuentoTextField.setText(""+boleta.getPorcentajeDescuento());
			montoDescuentoTextField.setText(""+boleta.getMontoDescuento());
			totalTextField.setText(""+boleta.getTotal());
			observacionesTextArea.setText(boleta.getObservaciones());
			
			ClienteDVO cliente = boleta.getCliente();
			
			if(cliente != null)
			{
				rutTextField.setText(cliente.getRut());
				nombreClienteTextField.setText(cliente.getNombre());
			}
			else
			{
				rutTextField.setText("");
				nombreClienteTextField.setText("");					
			}
			
			eliminarServicioButton.setEnabled(false);
			eliminarBoletaButton.setEnabled(true);
			guardarBoletaButton.setEnabled(false);
			actualizarBoletaButton.setEnabled(true);
			
			this.cargarTabla();
			
			
		}
		

		
		
		
		public void 		cargarTabla(){
			
			
			
			DefaultTableModel tableModel = (DefaultTableModel) this.detalleTable.getModel();
			ArrayList<ServicioDetalleBO> servicios =    this.boletaBO.getServiciosList();
			for (ServicioDetalleBO servicioDetalleBO : servicios) {

				
				boolean tieneFormula = false;
				if(servicioDetalleBO.getFormula().size()>1){
					tieneFormula = true;
				}
				
				tableModel.addRow(new Object[] { 
						servicioDetalleBO.getCantidad(),
						servicioDetalleBO.getNombre(),
						tieneFormula?"formula ingresada":"",
						servicioDetalleBO.getTipoCabello(),
						servicioDetalleBO.getPrecioUnitario(),
						servicioDetalleBO.getValorVenta()
	
				});
			}
			
		}
		
		
		private void verFormulasButtonActionPerformed(java.awt.event.ActionEvent evt) {
			

			if (detalleTable.getSelectedRow() > -1) {
				
						ServicioDetalleBO servicio = this.boletaBO.getServiciosList().get(detalleTable.getSelectedRow());

						Frame frame = JOptionPane.getFrameForComponent(this);

						try {
							servicioColor = new ServicioColor(frame, servicio,true);
							servicioColor.setVisible(true);
							servicioColor.getServicioDVO();
							this.servicioColor = servicioColor;
						
						} catch (SQLException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
			}

		}
			
	
		
		
		void nombreServicioComboBoxActionPerformed(java.awt.event.ActionEvent evt) throws SQLException{
		
			servicioColor = null;
			TipoCabelloDVO[] tc= PeluFacade.getPeluqueriaComponent().getTipoCabelloByNombre(((TablaDVO)nombreServicioComboBox.getSelectedItem()).getNombre());
			tipoCabelloComboBox.removeAllItems();
			for (TipoCabelloDVO tipoCabelloDVO : tc) {
				
				tipoCabelloComboBox.addItem(tipoCabelloDVO);
				
			}
			if(tipoCabelloComboBox.getItemCount()>1){
				
				tipoCabelloComboBox.setVisible(true);
				tipoCabelloLabel.setVisible(true);
				
				

			}else{
				tipoCabelloComboBox.setVisible(false);
				tipoCabelloLabel.setVisible(false);
				precioUnitarioTextField.setText( ""+PeluFacade.getPeluqueriaComponent().getPrecioByNombre(((TablaDVO)nombreServicioComboBox.getSelectedItem()).getNombre()));
				if(PeluFacade.getPeluqueriaComponent().isFormulaByNombre(((TablaDVO)nombreServicioComboBox.getSelectedItem()).getNombre())>0){
					
					agregaFormulaButton.setEnabled(true);
					
				}else{
					agregaFormulaButton.setEnabled(false);
				}
			}
		}	
		
		
		void borrarClienteButtonActionPerformed(java.awt.event.ActionEvent  evt){
			
			rutTextField.setText("");
			nombreClienteLabel.setText("");
			
		}
		
		
		private void actualizarBoletaActionPerformed(java.awt.event.ActionEvent evt) throws ParseException, SQLException {
			
			calcularPorcentajeDescuento();
			
			this.boletaBO.setObservaciones(observacionesTextArea.getText());
			this.boletaBO.setSubtotal(Integer.parseInt(subTotalTextField.getText()));
			this.boletaBO.setMontoDescuento(Integer.parseInt(montoDescuentoTextField.getText()));
			this.boletaBO.setTotal(Integer.parseInt(totalTextField.getText()));
			this.boletaBO.setNumeroBoleta(Integer.parseInt(numBoletaTextField.getText()));
			
			ClienteDVO cliente = new  ClienteDVO();
			cliente.setRut(rutTextField.getText());
			cliente.setNombre(nombreClienteTextField.getText());
			
			this.boletaBO.setCliente(cliente);
					
			if(JOptionPane.showConfirmDialog(null, "esta seguro de actualizar el registro")==JOptionPane.YES_OPTION){
					
				this.boletaBO.setFecha(df.parse(fechaBoletaTextField.getText()));
				PeluFacade.getPeluqueriaComponent().actualizarBoleta(this.boletaBO);
				JOptionPane.showMessageDialog(null,"La boleta fue actualizada correctamente con exito", "Guardar Boleta",JOptionPane.INFORMATION_MESSAGE );
				eliminarBoletaButton.setEnabled(true);
				actualizarBoletaButton.setEnabled(true);
				guardarBoletaButton.setEnabled(false);
			}
	
	  }
		
		
}
		